import { ElMessage } from 'element-plus'

// 错误类型枚举
export const ErrorTypes = {
  NETWORK: 'NETWORK',
  API: 'API',
  VALIDATION: 'VALIDATION',
  UNKNOWN: 'UNKNOWN'
}

// 错误处理配置
const errorConfig = {
  [ErrorTypes.NETWORK]: {
    title: '网络错误',
    message: '网络连接失败，请检查网络设置后重试',
    type: 'error',
    duration: 5000
  },
  [ErrorTypes.API]: {
    title: '请求失败',
    message: '服务器响应异常，请稍后重试',
    type: 'warning',
    duration: 4000
  },
  [ErrorTypes.VALIDATION]: {
    title: '输入错误',
    message: '请检查输入内容是否正确',
    type: 'warning',
    duration: 3000
  },
  [ErrorTypes.UNKNOWN]: {
    title: '未知错误',
    message: '发生未知错误，请刷新页面重试',
    type: 'error',
    duration: 5000
  }
}

// 全局错误处理器
export class ErrorHandler {
  constructor() {
    this.errorLog = []
    this.maxLogSize = 100
  }

  // 处理错误
  handleError(error, type = ErrorTypes.UNKNOWN, context = '') {
    // 记录错误日志
    this.logError(error, type, context)
    
    // 获取错误配置
    const config = errorConfig[type] || errorConfig[ErrorTypes.UNKNOWN]
    
    // 显示错误消息
    ElMessage({
      message: config.message,
      type: config.type,
      duration: config.duration,
      showClose: true
    })

    // 开发环境下输出详细错误信息
    if (import.meta.env.DEV) {
      console.group(`🚨 ${config.title}`)
      console.error('Error:', error)
      console.error('Type:', type)
      console.error('Context:', context)
      console.groupEnd()
    }
  }

  // 记录错误日志
  logError(error, type, context) {
    const errorEntry = {
      timestamp: new Date().toISOString(),
      type,
      context,
      message: error?.message || error?.toString() || 'Unknown error',
      stack: error?.stack,
      url: window.location.href,
      userAgent: navigator.userAgent
    }

    this.errorLog.push(errorEntry)
    
    // 限制日志大小
    if (this.errorLog.length > this.maxLogSize) {
      this.errorLog.shift()
    }

    // 可以在这里添加错误上报逻辑
    this.reportError(errorEntry)
  }

  // 错误上报（可以集成第三方服务如 Sentry）
  reportError(errorEntry) {
    // 这里可以添加错误上报逻辑
    // 例如：发送到服务器、第三方错误监控服务等
    if (import.meta.env.PROD) {
      // 生产环境下的错误上报
    }
  }

  // 获取错误日志
  getErrorLog() {
    return [...this.errorLog]
  }

  // 清空错误日志
  clearErrorLog() {
    this.errorLog = []
  }
}

// 创建全局错误处理器实例
export const globalErrorHandler = new ErrorHandler()

// 网络错误处理
export const handleNetworkError = (error) => {
  globalErrorHandler.handleError(error, ErrorTypes.NETWORK, 'API Request')
}

// API 错误处理
export const handleApiError = (error, endpoint = '') => {
  globalErrorHandler.handleError(error, ErrorTypes.API, `API: ${endpoint}`)
}

// 验证错误处理
export const handleValidationError = (error, field = '') => {
  globalErrorHandler.handleError(error, ErrorTypes.VALIDATION, `Validation: ${field}`)
}

// 全局未捕获错误处理
export const setupGlobalErrorHandling = () => {
  // 处理未捕获的 Promise 错误
  window.addEventListener('unhandledrejection', (event) => {
    globalErrorHandler.handleError(event.reason, ErrorTypes.UNKNOWN, 'Unhandled Promise Rejection')
    event.preventDefault()
  })

  // 处理未捕获的 JavaScript 错误
  window.addEventListener('error', (event) => {
    globalErrorHandler.handleError(event.error, ErrorTypes.UNKNOWN, 'Uncaught Error')
  })
}

// 默认导出
export default globalErrorHandler 